package juego;

import java.util.ArrayList;
import java.util.Iterator;

public class Caza extends Armado {

	//Atributos de clase
	private static int miImpacto = 10;
	private static int miPuntajePorDestruccion = 30;
	private static int miResistenciaMaxima = 6;
	private static int miTamanio = 4;
	private static int miVelocidad = 3;
	private static int miTiempoEspera = 4;
	
	//metodos
	
	//Constructor recibe coordenada
	public Caza(Coordenada ubicacion){
		super(ubicacion, miResistenciaMaxima, miTiempoEspera);
		ArmaTorpedoSimple unArmaTorpedoSimple = new ArmaTorpedoSimple();
		this.armamento.add(unArmaTorpedoSimple);
		
	};
	
	//Constructor recibe 2 enteros
	public Caza(int x, int y){
		super(new Coordenada(x,y), miResistenciaMaxima, miTiempoEspera);
		ArmaTorpedoSimple unArmaTorpedoSimple = new ArmaTorpedoSimple();
		this.armamento.add(unArmaTorpedoSimple);
		
	};
	
	//Constructor recibe 2 enteros y un arma que es la que tendra
	public Caza(int x, int y, Disparable arma){
		super(new Coordenada(x,y), miResistenciaMaxima, miTiempoEspera);
		this.armamento.add(arma);
		
	};
	
	@Override
	protected int velocidad() {
		return miVelocidad;
	}
    
	//Devuelve el tamanio de el caza
	@Override
	public int verTamanio() {
		return miTamanio;
	};
	
	//Devuelve el impacto provocado
    @Override
	public Impacto impactoProvocado(){
    	return new ImpactoLineal(miImpacto);
	};  
    
    //Devuelve el puntaje por haber sido destruido
    public int puntajePorDestruccion(){
    	return miPuntajePorDestruccion;
    };


    protected void movimientoPropio(){
    	int coordenadaY = this.velocidad();
    	this.ubicacion.moverEnXY(0,coordenadaY);
    };
    
  
    //Retorna el puntaje. Este metodo se encarga de la destruccion y liberacion
    //de las armas.
    @Override
    protected int impactar(ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
		int puntaje = 0;
		Iterator<Movil> iterador = listaDeMoviles.iterator();
		boolean contacto;
				
		while (iterador.hasNext()){
			
			Movil movil = iterador.next();
			try {
				contacto = movil.huboContacto(this);
				
				//solo puede ser impactado por el algo42 o proyectiles de este
				if (contacto & movil.verLealtad()){
					
					//recibe el impacto
					movil.impactoProvocado().herir(this.resistencia);
										
					//provoca el impacto
					movil.recibirImpacto(this.impactoProvocado(), listaDeMoviles, listaDeBotines);
					
					//si no esta vivo lo elimina de la lista
					if (!movil.estaVivo()){
						iterador.remove();
					};
				}
			}
			catch (Exception e){}
		}
		
		if (!this.resistencia.quedaEnergia()){
			
			//deja el botin
			this.dejarBotin(listaDeBotines);
			
			this.destruirse(listaDeMoviles);
			puntaje = this.puntajePorDestruccion();
			if (this.esGuia){
				this.provocarHuida(listaDeMoviles);
			}
		}
		
		return puntaje;
	};
	
	
	//Retorna el puntaje. Este metodo se encarga de la destruccion y liberacion
    //de las armas.
	@Override
	public int recibirImpacto(Impacto danio, ArrayList<Movil> listaDeMoviles, ArrayList<Botin> listaDeBotines){
		danio.herir(this.resistencia);
		
		if (resistencia.quedaEnergia()){
			return 0;
		}
		else {
			//deja el botin
			this.dejarBotin(listaDeBotines);
			
			this.vivo = false;
			if (this.esGuia){
				this.provocarHuida(listaDeMoviles);
			}
			return this.puntajePorDestruccion();}
	};
	
	
	private void dejarBotin(ArrayList<Botin> listaDeBotines) {
		Botin tanque = new TanqueEnergia(this.ubicacion);
		listaDeBotines.add(tanque);

	}

	
		
	

}

